
package modele;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import modele.exceptions.IntervenantInexistantException;

/**
 * Class Intervenant correspond aux tuteurs et aux enseignants, un intervenant
 * peut être les deux à la fois.
 */
public class Intervenant extends Personne
{
    /**
     * Constructeur permettant de créer un nouvel intervenant.
     * L'identifiant est unique pour un intervenant, mais pas par rapport à Personne.
     */
    public Intervenant(int id, String nom, String prenom, String email, String tel)
    {
        super(id, nom, prenom, "", email, tel, "", "");
    }

    /**
     * Constructeur partiel de Intervenant, ne doit être utilisé que lorsqu'on n'a
     * pas besoin des autres informations
     */
    public Intervenant(int id, String nom, String prenom)
    {
        this(id, nom, prenom, null, null);
    }
    
    //Méthodes statiques d'accès à la base de données

    /**
     * Renvoie la liste de tous les intervenants
     * @return la liste demandée avec toutes les informations des intervenants
     */
    public static List<Intervenant> getTousLesIntervenants() throws SQLException
    {
        List<Intervenant> resultat = new ArrayList<Intervenant>();

        String requete = "Select id_formateur, prenom, nom, email, tel from formateur order by nom, prenom;";
        Connection c = ConnexionBD.getConnection();
        Statement s = c.createStatement();
        ResultSet rs = s.executeQuery(requete);

        while(rs.next())
        {
            int idformateur = (Integer) rs.getObject(1);
            String prenom = (String) rs.getObject(2);
            String nom = (String) rs.getObject(3);
            String email = (String) rs.getObject(4);
            String tel = (String) rs.getObject(5);
            Intervenant i = new Intervenant(idformateur, nom, prenom, email, tel);

            resultat.add(i);
        }

        c.close();

        return resultat;
    }

    /**
     * Renvoie l'intervenant correspondant à un identifiant s'il existe, une exception sinon
     * @param id_formateur : l'identifiant de l'intervenant demandé
     * @return l'intervenant demandé avec toutes ses informations
     * @throws IntervenantInexistantException si l'intervenant demandé n'existe pas
     */
    public static Intervenant getIntervenant(int id_formateur) throws IntervenantInexistantException, SQLException
    {
        Intervenant resultat = null;

        String requete = "Select prenom, nom, email, tel from formateur where id_formateur = ?;";
        Connection c = ConnexionBD.getConnection();
        PreparedStatement ps = c.prepareStatement(requete);
        ps.setInt(1, id_formateur);
        ResultSet rs = ps.executeQuery();

        if(rs.next())
        {
            //L'intervenant existe
            String prenom = (String) rs.getObject(1);
            String nom = (String) rs.getObject(2);
            String email = (String) rs.getObject(3);
            String tel = (String) rs.getObject(4);
            resultat = new Intervenant(id_formateur, nom, prenom, email, tel);
        }
        else
        {
            //L'intervenant n'existe pas
            throw new IntervenantInexistantException();
        }

        c.close();

        return resultat;

    }

    /**
     * Renvoie la liste des tuteurs d'une année et d'une formation
     * @return la liste demandée avec seulement les nom et prénom des tuteurs
     */
    public static List<Intervenant> getTuteurs(String id_annee, int id_formation) throws SQLException
    {
        List<Intervenant> resultat = new ArrayList<Intervenant>();

        String requete = "Select distinct id_tuteur, t.nom, t.prenom from etudiant e, formateur t where id_annee = ? and id_formation = ? and e.id_tuteur = t.id_formateur order by nom, prenom;";
        Connection c = ConnexionBD.getConnection();
        PreparedStatement ps = c.prepareStatement(requete);
        ps.setString(1, id_annee);
        ps.setInt(2, id_formation);
        ResultSet rs = ps.executeQuery();

        while(rs.next())
        {
            int idformateur = (Integer) rs.getObject(1);
            String nom = (String) rs.getObject(2);
            String prenom = (String) rs.getObject(3);
            Intervenant i = new Intervenant(idformateur, nom, prenom);

            resultat.add(i);
        }

        c.close();

        return resultat;
    }

    /**
     * Renvoie les matières enseignées par un intervenant
     * @param id_formateur : identifiant de l'enseignant demandé
     * @return la liste des matières demandées avec seulement leur nom
     */
    public static List<Matiere> getMatieres(int id_formateur) throws SQLException
    {
        List<Matiere> resultat = new ArrayList<Matiere>();

        String requete = "Select id_module, sigle, nom from module where id_formateur = ? order by nom;";
        Connection c = ConnexionBD.getConnection();
        PreparedStatement ps = c.prepareStatement(requete);
        ps.setInt(1, id_formateur);
        ResultSet rs = ps.executeQuery();

        while(rs.next())
        {
            int idm = (Integer) rs.getObject(1);
            String nom = (String) rs.getObject(2);
            String nomComplet = (String) rs.getObject(3);
            Matiere m = new Matiere(idm, nom, nomComplet);
            resultat.add(m);
        }

        c.close();

        return resultat;
    }

 
}
